{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "用Python编写函数stdProc实现常见数据标准化方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "#该函数用于获取数据x的各种标准化值\n",
    "# x:用于标准化的实数数组\n",
    "# is_positive:是否是正向指标\n",
    "def std_proc(x,is_positive=True):\n",
    "    x = np.array(x)\n",
    "    v_max, v_min, v_std, v_mean = np.max(x), np.min(x), np.std(x), np.mean(x)\n",
    "    # 1. 线性标准化\n",
    "    #---极差标准化\n",
    "    if v_max > v_min:\n",
    "        yExt = (x - v_min if is_positive else v_max - x)/(v_max - v_min)\n",
    "    else:\n",
    "        print(\"最大值与最小值相等，不能进行极差标准化!\")\n",
    "        yExt = None\n",
    "    \n",
    "    #---z-score标准化\n",
    "    if v_std == 0:\n",
    "        print(\"由于标准差为0，不能进行z-score标准化\")\n",
    "        yZsc=NULL\n",
    "    else:\n",
    "        yZsc=(x-v_mean)/v_std\n",
    "\n",
    "    #---小数定标标准化\n",
    "    yPot = x/(10**len(str(np.max(np.abs(x)))))\n",
    "    \n",
    "    # 2. 非线性标准化\n",
    "    #---对数标准化\n",
    "    y = np.log((x-v_min if is_positive else v_max - x)+1)\n",
    "    yLog = y/np.max(y)\n",
    "\n",
    "    #---倒数标准化\n",
    "    yInv=np.min(np.abs(x[x!=0]))/x\n",
    "    \n",
    "    return {\"yExt\":yExt,\"yZsc\":yZsc,\"yPot\":yPot,\"yLog\":yLog,\"yInv\":yInv}"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
